package com.jinmdz.fmis.api.base;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jinmdz.fmis.api.api.model.common.IdVersionData;
import com.jinmdz.fmis.api.constant.MessageConst;
import com.jinmdz.fmis.api.model.config.ConfigApp;
import com.jinmdz.fmis.api.model.config.ConfigData;
import com.jinmdz.fmis.api.model.system.UserItem;
import com.jinmdz.fmis.common.util.DataUtil;
import com.jinmdz.fmis.core.base.BaseBean;
import com.jinmdz.fmis.core.base.BasePageData;
import com.jinmdz.fmis.core.base.BaseResult;
import com.jinmdz.fmis.core.constant.EResultCode;
import com.jinmdz.fmis.core.exception.ActionException;
import com.jinmdz.fmis.core.model.SearchLoadData;
import com.jinmdz.fmis.core.model.SearchPageItem;
import com.jinmdz.fmis.core.util.LogUtil;
import com.jinmdz.fmis.core.wrapper.ResultWrapper;
import com.jinmdz.fmis.dao.dao.GlobalDao;
import com.jinmdz.fmis.mapper.base.BaseEntity;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;

/**
 * 封装Service基类
 *
 * @author LiCongLu
 * @date 2020-01-13 11:43
 */
public class BaseService {

    @Resource
    private ConfigApp configApp;

    @Resource
    private ConfigData configData;

    @Resource
    private GlobalDao globalDao;

    /**
     * 返回数据当前时间
     *
     * @param
     * @return
     * @author LiCongLu
     * @date 2020-04-16 16:56
     */
    public Date nowDate() {
        return globalDao.getNowForDate();
    }

    /**
     * 返回失败结果
     *
     * @param message 失败信息
     * @return
     * @author LiCongLu
     * @date 2020-01-13 11:44
     */
    public BaseResult failure(String message) {
        return ResultWrapper.failure(message);
    }

    /**
     * 版本错误信息
     *
     * @param message 错误信息
     * @return
     * @author LiCongLu
     * @date 2020-02-06 14:36
     */
    public String versionError(String message) {
        return message + MessageConst.VERSION_ERROR;
    }

    /**
     * 返回正确结果
     *
     * @param message 正确信息
     * @return
     * @author LiCongLu
     * @date 2020-01-13 11:47
     */
    public BaseResult success(String message) {
        return ResultWrapper.success(message);
    }

    /**
     * 返回正确结果
     *
     * @param result 结果信息
     * @return
     * @author LiCongLu
     * @date 2020-01-15 08:52
     */
    public BaseResult success(BaseResult result) {
        if (result == null) {
            result = ResultWrapper.getResult();
        }
        return result.setResultCode(EResultCode.CODE1);
    }

    /**
     * 返回正确结果
     *
     * @param data 响应结果
     * @return
     * @author GuanKui
     * @date 2020/2/11 12:57
     */
    public <T extends BaseBean> BaseResult successData(T data) {
        if (data == null) {
            return success(MessageConst.NO_DATA);
        }
        BaseResult<T> result = ResultWrapper.getBaseResult();
        result.setData(data);
        return result.setResultCode(EResultCode.CODE1);
    }

    /**
     * 返回集合结果
     *
     * @param data 响应结果
     * @return
     * @author LiCongLu
     * @date 2020-02-20 20:39
     */
    public <T extends BaseBean> BaseResult successList(ArrayList<T> data) {
        if (data == null) {
            return success(MessageConst.NO_DATA);
        }
        BaseResult<ArrayList<T>> result = ResultWrapper.getBaseResult();
        result.setData(data);
        return result.setResultCode(EResultCode.CODE1);
    }

    /**
     * 抛出异常信息
     *
     * @param message 异常信息
     * @return
     * @author LiCongLu
     * @date 2020-02-06 11:51
     */
    public ActionException exception(String message) {
        return new ActionException(message);
    }

    /**
     * 创建实体类，统一设置殡仪馆代码
     *
     * @param clazz 需要创建的类型
     * @return
     * @author LiCongLu
     * @date 2020-01-15 10:00
     */
    public <T extends BaseEntity> T getEntity(Class<T> clazz) {
        T entity = null;
        try {
            entity = (T) clazz.newInstance();
            entity.setFuneralParlourCode(configApp.getFuneralParlourCode());
        } catch (Exception e) {
            LogUtil.error("创建实体错误", e);
        }
        return entity;
    }

    /**
     * 创建实体类，统一设置创建人及修改人
     *
     * @param userItem 当前登录帐号
     * @param clazz    需要创建的类型
     * @return
     * @author LiCongLu
     * @date 2020-01-15 11:24
     */
    public <T extends BaseEntity> T getEntity(UserItem userItem, Class<T> clazz) {
        T entity = getEntity(clazz);
        if (entity != null) {
            entity.setCreateUserId(userItem.getId())
                    .setModifiedUserId(userItem.getId());
        }
        return entity;
    }

    /**
     * 获取Request请求
     *
     * @return
     */
    public HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    /**
     * 获取 Response响应
     *
     * @return
     */
    public HttpServletResponse getResponse() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    }

    /**
     * 获取基地址
     *
     * @param
     * @return
     * @author GuanKui
     * @date 2020/3/4  16:10
     */
    public String getBaserUrl() {
        HttpServletRequest request = getRequest();
        String baseUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
        return baseUrl;
    }


    /**
     * 初始化分页数据
     *
     * @param data 分页数据
     * @return
     * @author LiCongLu
     * @date 2020-03-06 22:35
     */
    public void startPageData(BasePageData data) {
        if (data != null) {
            if (DataUtil.invalid(data.getCurrentPage())) {
                data.setCurrentPage(1);
            }
            if (DataUtil.invalid(data.getPageSize())) {
                data.setPageSize(configData.getQueryPageSize());
            }

            // 初始化PageHelper
            PageHelper.startPage(data.getCurrentPage(), data.getPageSize());
        }
    }

    /**
     * 获取查询接在
     *
     * @param dataList 数据集合
     * @return
     * @author LiCongLu
     * @date 2020-03-06 23:57
     */
    public <T> SearchLoadData<T> getSearchLoadData(ArrayList<T> dataList) {

        // 使用PageHelper进行数据分组
        PageInfo<T> pageInfo = new PageInfo<>(dataList);

        // 初始化返回实体
        SearchLoadData<T> loadData = new SearchLoadData<>();

        // 初始化分页信息实体
        SearchPageItem pageItem = new SearchPageItem();
        pageItem.setCurrentPage(pageInfo.getPageNum())
                .setPageSize(pageInfo.getPageSize())
                .setTotal(pageInfo.getTotal());

        // 初始化分页信息实体
        loadData.setPager(pageItem);

        // 设置数组信息
        loadData.setList(pageInfo.getList());
        return loadData;
    }

    /**
     * 获取主键去重大小
     *
     * @param data 主键和数据版本
     * @return
     * @author LiCongLu
     * @date 2020-03-26 10:53
     */
    public int getRepeatIdSize(ArrayList<IdVersionData> data) {
        return getRepeatIdList(data).size();
    }

    /**
     * 获取主键去重主键集合
     *
     * @param data 主键和数据版本
     * @return
     * @author LiCongLu
     * @date 2020-03-26 10:53
     */
    public ArrayList<Integer> getRepeatIdList(ArrayList<IdVersionData> data) {
        // 记录主键
        ArrayList<Integer> idList = new ArrayList<>();
        for (IdVersionData idData : data) {
            if (!idList.contains(idData.getId())) {
                idList.add(idData.getId());
            }
        }
        // 去重
        idList = DataUtil.repeatArrayList(idList);
        return idList;
    }
}
